package com.fengkai.filepost.pdfoutstream.test.ODsolutions;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;

/**
 * @author Fengkai
 * @creat 2023/4/23
 * 勾股数元组
 * 如果 3 个正整数(a,b,c)满足 a2 + b2 = c2 的关系，则称(a,b,c)为勾股数（著名的勾三股四弦五），为了探索勾股数的规律，我们定义如果勾股数(a,b,c)之间两两互质（即 a 与 b，a 与 c，b 与 c 之间均互质，没有公约数），则其为勾股数元祖（例如(3,4,5)是勾股数元祖，(6,8,10)则不是勾股数元祖）。请求出给定范围[N,M]内，所有的勾股数元祖。
 * 输入输出描述:
 * 输入描述:
 * 起始范围 N，1 <= N <= 10000
 * 结束范围 M，N < M <= 10000
 * 输出描述:
 * a,b,c 请保证 a < b < c,输出格式：a b c；
 * 多组勾股数元祖请按照 a 升序，b 升序，最后 c 升序的方式排序输出；
 * 给定范围中如果找不到勾股数元祖时，输出”NA”。
 */
public class GouGuYuanArray {
    public static void main (String[] args) {
        ArrayList gouguShuList = getGouguShuList(1, 30);
        Iterator iterator = gouguShuList.iterator();
        while (iterator.hasNext()) {
            int[] p = (int[]) iterator.next();
            int i  = p[0];
            int j  = p[1];
            int k  = p[2];
            if (checkIsResult(i, j, k)){
                System.out.println(i + " " + j + " " + k);
            }
        }
    }

    private static boolean checkIsResult(int i, int j, int k){
        for (int l = 2; l <= j ; l++) {
            if (i % l == 0 && j % l == 0){
                return false;
            }else if (i % l == 0 && k % l == 0){
                return false;
            }else if (k % l == 0 && k % l == 0){
                return false;
            }
        }
        return true;
    }
    public static ArrayList<int[]> getGouguShuList (int m, int n) {
        ArrayList<int[]> gouGuInts = new ArrayList<>();
        HashMap<Integer, Integer> headKey = new HashMap<>();
        boolean dp[] = new boolean[n - m + 1];
        int index = 0;
        for (int i = m; i <= n; i++) {
            for (int j = m + 1; j < n; j++) {
                int mul = i * i + j * j;
                double sqrt = Math.sqrt(mul);
                if (sqrt % 1 == 0 && sqrt <= n) {
                    int k = (int) sqrt;
                    int[] ints = {i, j, k};
                    Arrays.sort(ints);
                    if (!headKey.containsKey(ints[0])){
                        gouGuInts.add(ints);
                        headKey.put(ints[0], 0);
                    }

                }
            }
            index++;
        }
        return gouGuInts;
    }
}
